suppressMessages(suppressWarnings({
  library(magrittr, quietly = TRUE)
  library(tibble, quietly = TRUE)
  library(dplyr, quietly = TRUE)
  #library(Matrix, quietly = TRUE)
  #library(qgraph, quietly = TRUE)
  #library(psych, quietly = TRUE)
  #library(corpcor, quietly = TRUE)
  #library(corrplot, quietly = TRUE)
  library(knitr, quietly = TRUE)
}))
source('plotting_functions.R')
source('../get_cor_genes.R')
opts_chunk$set(
  dev = c("png", "pdf"), 
  dpi = 150
  #,
  #fig.width = 8/2.54, fig.height = 8/2.54
)

1 Get data

require(SummarizedExperiment)
require(magrittr)
#
#
# Join Rdata files to singe SummarizedExperiment class
#setwd('/Users/nataliabulgakova/Documents/R/RNAseq')
dir('../data', full.names = TRUE, pattern = 'Rdata') %>% sapply(function(x) get(load(x)) ) -> SE_list
SE <- do.call(cbind, SE_list)
colnames(SE) <- gsub('(SRR[0-9]+)\\.bam', '\\1', colnames(SE))

2 Hi correlations with given gene

library(org.Hs.eg.db)
require(DESeq2)
sig <- getHiCor(SE, SYMBOL='CDH1', rpkm='TRUE', cor_cutoff=0.7, anticor_cutoff=-0.6)
sig

3 Correlations

library(psych, quietly = TRUE)
M <- t(fpkm(DESeqDataSet(SE, ~1), robust = TRUE)[sig$entrez,])
R <- cor(M)
rownames(R) <- sig$SYMBOL
colnames(R) <- sig$SYMBOL
P  <- corr.p(R, nrow(assay(SE)), adjust="fdr")$p
if(!all( R[lower.tri(R)] == t(R)[lower.tri(R)] )) stop('Matrix R is not symetric!')
P[lower.tri(P)] <- t(P)[lower.tri(P)]

3.1 Plot

library(corrplot, quietly = TRUE)
corrplot(
  R, order = "AOE", type = 'lower', diag=T, 
  method = 'number', tl.pos = 'lt', p.mat=P, sig.level=0.05
)
corrplot(
  R, order = "AOE", type = 'upper',diag=F, 
  add = TRUE, method = 'circle', tl.pos = 'n', p.mat=P, insig = "p-value", sig.level=0.05
)

3.2 Speraman correlation coeficiemnt

knitr::kable(R, "html", table.attr = 'class="table table-condensed corrtable"', digits =2, padding = 1)
CDH1 ESRP2 MARVELD3 TSPAN13 EPCAM GRHL2 SNRPD3 TJP3 NECTIN4 ARHGEF16 LAD1 SPINT1 TMEM141 SPRR2A SH3YL1 PEX13 TMPRSS4 TRAF4 DHRS13 MISP LIX1L CCDC88A CD99L2
CDH1 1.00 0.88 0.87 0.77 0.75 0.74 0.73 0.73 0.72 0.72 0.71 0.71 0.71 0.71 0.71 0.71 0.70 0.70 0.70 0.70 -0.65 -0.61 -0.60
ESRP2 0.88 1.00 0.83 0.68 0.73 0.84 0.58 0.75 0.73 0.81 0.62 0.79 0.65 0.50 0.68 0.57 0.52 0.72 0.56 0.69 -0.70 -0.61 -0.64
MARVELD3 0.87 0.83 1.00 0.77 0.71 0.75 0.69 0.62 0.80 0.75 0.85 0.73 0.70 0.70 0.78 0.59 0.71 0.67 0.67 0.55 -0.65 -0.63 -0.64
TSPAN13 0.77 0.68 0.77 1.00 0.59 0.46 0.66 0.56 0.76 0.64 0.70 0.48 0.72 0.80 0.69 0.72 0.69 0.60 0.70 0.50 -0.34 -0.29 -0.40
EPCAM 0.75 0.73 0.71 0.59 1.00 0.56 0.45 0.67 0.59 0.79 0.42 0.60 0.64 0.64 0.62 0.69 0.65 0.49 0.59 0.68 -0.58 -0.56 -0.60
GRHL2 0.74 0.84 0.75 0.46 0.56 1.00 0.45 0.54 0.66 0.60 0.62 0.69 0.37 0.37 0.68 0.35 0.42 0.51 0.37 0.43 -0.71 -0.65 -0.60
SNRPD3 0.73 0.58 0.69 0.66 0.45 0.45 1.00 0.40 0.53 0.43 0.64 0.48 0.65 0.54 0.42 0.57 0.52 0.47 0.62 0.41 -0.33 -0.44 -0.48
TJP3 0.73 0.75 0.62 0.56 0.67 0.54 0.40 1.00 0.69 0.74 0.44 0.63 0.58 0.57 0.59 0.54 0.62 0.70 0.56 0.75 -0.47 -0.50 -0.47
NECTIN4 0.72 0.73 0.80 0.76 0.59 0.66 0.53 0.69 1.00 0.68 0.79 0.60 0.73 0.79 0.78 0.64 0.78 0.61 0.67 0.46 -0.42 -0.48 -0.45
ARHGEF16 0.72 0.81 0.75 0.64 0.79 0.60 0.43 0.74 0.68 1.00 0.56 0.77 0.73 0.59 0.61 0.50 0.65 0.75 0.63 0.74 -0.61 -0.50 -0.55
LAD1 0.71 0.62 0.85 0.70 0.42 0.62 0.64 0.44 0.79 0.56 1.00 0.52 0.67 0.74 0.77 0.52 0.71 0.57 0.68 0.37 -0.48 -0.47 -0.47
SPINT1 0.71 0.79 0.73 0.48 0.60 0.69 0.48 0.63 0.60 0.77 0.52 1.00 0.60 0.32 0.47 0.35 0.49 0.65 0.54 0.64 -0.63 -0.64 -0.62
TMEM141 0.71 0.65 0.70 0.72 0.64 0.37 0.65 0.58 0.73 0.73 0.67 0.60 1.00 0.76 0.58 0.69 0.72 0.62 0.79 0.64 -0.27 -0.43 -0.41
SPRR2A 0.71 0.50 0.70 0.80 0.64 0.37 0.54 0.57 0.79 0.59 0.74 0.32 0.76 1.00 0.78 0.82 0.91 0.50 0.75 0.46 -0.28 -0.33 -0.32
SH3YL1 0.71 0.68 0.78 0.69 0.62 0.68 0.42 0.59 0.78 0.61 0.77 0.47 0.58 0.78 1.00 0.65 0.66 0.38 0.47 0.39 -0.56 -0.47 -0.52
PEX13 0.71 0.57 0.59 0.72 0.69 0.35 0.57 0.54 0.64 0.50 0.52 0.35 0.69 0.82 0.65 1.00 0.77 0.40 0.62 0.49 -0.31 -0.38 -0.42
TMPRSS4 0.70 0.52 0.71 0.69 0.65 0.42 0.52 0.62 0.78 0.65 0.71 0.49 0.72 0.91 0.66 0.77 1.00 0.61 0.81 0.52 -0.33 -0.43 -0.40
TRAF4 0.70 0.72 0.67 0.60 0.49 0.51 0.47 0.70 0.61 0.75 0.57 0.65 0.62 0.50 0.38 0.40 0.61 1.00 0.71 0.69 -0.44 -0.41 -0.50
DHRS13 0.70 0.56 0.67 0.70 0.59 0.37 0.62 0.56 0.67 0.63 0.68 0.54 0.79 0.75 0.47 0.62 0.81 0.71 1.00 0.52 -0.26 -0.33 -0.36
MISP 0.70 0.69 0.55 0.50 0.68 0.43 0.41 0.75 0.46 0.74 0.37 0.64 0.64 0.46 0.39 0.49 0.52 0.69 0.52 1.00 -0.48 -0.58 -0.50
LIX1L -0.65 -0.70 -0.65 -0.34 -0.58 -0.71 -0.33 -0.47 -0.42 -0.61 -0.48 -0.63 -0.27 -0.28 -0.56 -0.31 -0.33 -0.44 -0.26 -0.48 1.00 0.60 0.64
CCDC88A -0.61 -0.61 -0.63 -0.29 -0.56 -0.65 -0.44 -0.50 -0.48 -0.50 -0.47 -0.64 -0.43 -0.33 -0.47 -0.38 -0.43 -0.41 -0.33 -0.58 0.60 1.00 0.59
CD99L2 -0.60 -0.64 -0.64 -0.40 -0.60 -0.60 -0.48 -0.47 -0.45 -0.55 -0.47 -0.62 -0.41 -0.32 -0.52 -0.42 -0.40 -0.50 -0.36 -0.50 0.64 0.59 1.00

3.3 Cor test p-val

knitr::kable(P, "html", table.attr = 'class="table table-condensed corrtable"', digits =2, padding = 1)
CDH1 ESRP2 MARVELD3 TSPAN13 EPCAM GRHL2 SNRPD3 TJP3 NECTIN4 ARHGEF16 LAD1 SPINT1 TMEM141 SPRR2A SH3YL1 PEX13 TMPRSS4 TRAF4 DHRS13 MISP LIX1L CCDC88A CD99L2
CDH1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ESRP2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MARVELD3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
TSPAN13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
EPCAM 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GRHL2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SNRPD3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
TJP3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
NECTIN4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ARHGEF16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LAD1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SPINT1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
TMEM141 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SPRR2A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SH3YL1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
PEX13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
TMPRSS4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
TRAF4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DHRS13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MISP 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LIX1L 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CCDC88A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CD99L2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

4 Speraman correlation network - spring layout

4.1 Significant correlations

library(qgraph, quietly = TRUE)
  r <- R
  r[P > 0.05] <- NA 
  diag(r) <- NA
  z <- qgraph(r, layout = "spring", title = 'Speraman correlation network - significant correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
  z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
  plot(z)

4.2 All correlations

  z <- qgraph(R, layout = "spring", title = 'Speraman correlation network - all correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
  z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
  plot(z)

5 Speraman correlation network - circle layout

5.1 Significant correlations

  z <- qgraph(r, layout = "circle", title = 'Speraman correlation network - significant correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
  z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
  plot(z)

5.2 All correlations

  z <- qgraph(R, layout = "circle", title = 'Speraman correlation network - all correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
  z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
  plot(z)

6 Speraman correlation network - with LASSO

  #Needed only if cor(M) is no PD
  #colnames(M) <- sig$SYMBOL
  #MM <- collapsemaxcor(M, method = 'pearson')
  #while(!attr(MM, 'PD')) {
  #  MM <- collapsemaxcor(MM, method = 'pearson')
  #}
  

6.1 Significant correlations

  r <- cor(M)
  p <- corr.p(r, 20000, adjust = 'none')
  r[p$p > 0.05] <- 0 #
  EBICgraph <- EBICglasso(r, 20000, 0.5)
  z <- qgraph(EBICgraph, layout = "spring", title = 'Speraman correlation network - significant correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
  z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
  plot(z)

6.2 All correlations

  r <- cor(M)
  EBICgraph <- EBICglasso(r, 20000, 0.5)
Network with lowest lambda selected as best network. Try setting 'lambda.min.ratio' lower.
  z <- qgraph(EBICgraph, layout = "spring", title = 'Speraman correlation network - all correlations', DoNotPlot=TRUE, directed=FALSE, bidirectional=TRUE)
  z$graphAttributes$Nodes$labels <- names(z$graphAttributes$Nodes$labels)
  plot(z)

LS0tCnRpdGxlOiAiSW50ZXJhY3Rpb24gbmV0d29ya3Mgd2l0aCBzaWduaWZpY2FuY2UgdGVzdGluZyIKYXV0aG9yOiAiUHJ6ZW15c2xhdyBBbGVrc2FuZGVyIFN0ZW1wb3IiCmRhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkICVCICVZIilgJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2hlaWdodDogMTAKICAgIGZpZ19yZXRpbmE6IDEKICAgIGZpZ193aWR0aDogMTAKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpgYGB7cn0Kc3VwcHJlc3NNZXNzYWdlcyhzdXBwcmVzc1dhcm5pbmdzKHsKICBsaWJyYXJ5KG1hZ3JpdHRyLCBxdWlldGx5ID0gVFJVRSkKICBsaWJyYXJ5KHRpYmJsZSwgcXVpZXRseSA9IFRSVUUpCiAgbGlicmFyeShkcGx5ciwgcXVpZXRseSA9IFRSVUUpCiAgI2xpYnJhcnkoTWF0cml4LCBxdWlldGx5ID0gVFJVRSkKICAjbGlicmFyeShxZ3JhcGgsIHF1aWV0bHkgPSBUUlVFKQogICNsaWJyYXJ5KHBzeWNoLCBxdWlldGx5ID0gVFJVRSkKICAjbGlicmFyeShjb3JwY29yLCBxdWlldGx5ID0gVFJVRSkKICAjbGlicmFyeShjb3JycGxvdCwgcXVpZXRseSA9IFRSVUUpCiAgbGlicmFyeShrbml0ciwgcXVpZXRseSA9IFRSVUUpCn0pKQpzb3VyY2UoJ3Bsb3R0aW5nX2Z1bmN0aW9ucy5SJykKc291cmNlKCcuLi9nZXRfY29yX2dlbmVzLlInKQpvcHRzX2NodW5rJHNldCgKICBkZXYgPSBjKCJwbmciLCAicGRmIiksIAogIGRwaSA9IDE1MAogICMsCiAgI2ZpZy53aWR0aCA9IDgvMi41NCwgZmlnLmhlaWdodCA9IDgvMi41NAopCgpgYGAKCgo8c3R5bGU+CiAgdGFibGUuY29ycnRhYmxlIHRkOm50aC1jaGlsZCgxKXsKICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgfQogIGJvZHkgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWFyZ2luOiBhdXRvOwogICAgcGFkZGluZzogMWVtOwogICAgbGluZS1oZWlnaHQ6IDIwcHggOyAKICB9IAogIGRpdi5tYWluLWNvbnRhaW5lciB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQo8L3N0eWxlPgoKCiMgR2V0IGRhdGEgCgpgYGB7cn0KcmVxdWlyZShTdW1tYXJpemVkRXhwZXJpbWVudCkKcmVxdWlyZShtYWdyaXR0cikKIwoKIwoKCiMgSm9pbiBSZGF0YSBmaWxlcyB0byBzaW5nZSBTdW1tYXJpemVkRXhwZXJpbWVudCBjbGFzcwojc2V0d2QoJy9Vc2Vycy9uYXRhbGlhYnVsZ2Frb3ZhL0RvY3VtZW50cy9SL1JOQXNlcScpCmRpcignLi4vZGF0YScsIGZ1bGwubmFtZXMgPSBUUlVFLCBwYXR0ZXJuID0gJ1JkYXRhJykgJT4lIHNhcHBseShmdW5jdGlvbih4KSBnZXQobG9hZCh4KSkgKSAtPiBTRV9saXN0ClNFIDwtIGRvLmNhbGwoY2JpbmQsIFNFX2xpc3QpCmNvbG5hbWVzKFNFKSA8LSBnc3ViKCcoU1JSWzAtOV0rKVxcLmJhbScsICdcXDEnLCBjb2xuYW1lcyhTRSkpCmBgYAoKCiMgSGkgY29ycmVsYXRpb25zIHdpdGggZ2l2ZW4gZ2VuZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShvcmcuSHMuZWcuZGIpCnJlcXVpcmUoREVTZXEyKQoKc2lnIDwtIGdldEhpQ29yKFNFLCBTWU1CT0w9J0NESDEnLCBycGttPSdUUlVFJywgY29yX2N1dG9mZj0wLjcsIGFudGljb3JfY3V0b2ZmPS0wLjYpCnNpZwoKYGBgCgoKIyBDb3JyZWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgoKYGBge3J9CmxpYnJhcnkocHN5Y2gsIHF1aWV0bHkgPSBUUlVFKQoKTSA8LSB0KGZwa20oREVTZXFEYXRhU2V0KFNFLCB+MSksIHJvYnVzdCA9IFRSVUUpW3NpZyRlbnRyZXosXSkKClIgPC0gY29yKE0pCnJvd25hbWVzKFIpIDwtIHNpZyRTWU1CT0wKY29sbmFtZXMoUikgPC0gc2lnJFNZTUJPTAoKUCAgPC0gY29yci5wKFIsIG5yb3coYXNzYXkoU0UpKSwgYWRqdXN0PSJmZHIiKSRwCgppZighYWxsKCBSW2xvd2VyLnRyaShSKV0gPT0gdChSKVtsb3dlci50cmkoUildICkpIHN0b3AoJ01hdHJpeCBSIGlzIG5vdCBzeW1ldHJpYyEnKQpQW2xvd2VyLnRyaShQKV0gPC0gdChQKVtsb3dlci50cmkoUCldCgoKYGBgCgojIyBQbG90CgpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9Nn0KbGlicmFyeShjb3JycGxvdCwgcXVpZXRseSA9IFRSVUUpCgpjb3JycGxvdCgKICBSLCBvcmRlciA9ICJBT0UiLCB0eXBlID0gJ2xvd2VyJywgZGlhZz1ULCAKICBtZXRob2QgPSAnbnVtYmVyJywgdGwucG9zID0gJ2x0JywgcC5tYXQ9UCwgc2lnLmxldmVsPTAuMDUKKQpjb3JycGxvdCgKICBSLCBvcmRlciA9ICJBT0UiLCB0eXBlID0gJ3VwcGVyJyxkaWFnPUYsIAogIGFkZCA9IFRSVUUsIG1ldGhvZCA9ICdjaXJjbGUnLCB0bC5wb3MgPSAnbicsIHAubWF0PVAsIGluc2lnID0gInAtdmFsdWUiLCBzaWcubGV2ZWw9MC4wNQopCmBgYAoKIyMgU3BlcmFtYW4gY29ycmVsYXRpb24gY29lZmljaWVtbnQKYGBge3J9CmtuaXRyOjprYWJsZShSLCAiaHRtbCIsIHRhYmxlLmF0dHIgPSAnY2xhc3M9InRhYmxlIHRhYmxlLWNvbmRlbnNlZCBjb3JydGFibGUiJywgZGlnaXRzID0yLCBwYWRkaW5nID0gMSkKYGBgCgojIyBDb3IgdGVzdCBwLXZhbApgYGB7cn0Ka25pdHI6OmthYmxlKFAsICJodG1sIiwgdGFibGUuYXR0ciA9ICdjbGFzcz0idGFibGUgdGFibGUtY29uZGVuc2VkIGNvcnJ0YWJsZSInLCBkaWdpdHMgPTIsIHBhZGRpbmcgPSAxKQpgYGAKCgoKIyBTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gc3ByaW5nIGxheW91dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFNpZ25pZmljYW50IGNvcnJlbGF0aW9ucwpgYGB7ciwgd2FybmluZz1GQUxTRX0KbGlicmFyeShxZ3JhcGgsIHF1aWV0bHkgPSBUUlVFKQogIHIgPC0gUgogIHJbUCA+IDAuMDVdIDwtIE5BIAogIGRpYWcocikgPC0gTkEKICB6IDwtIHFncmFwaChyLCBsYXlvdXQgPSAic3ByaW5nIiwgdGl0bGUgPSAnU3BlcmFtYW4gY29ycmVsYXRpb24gbmV0d29yayAtIHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCiMjIEFsbCBjb3JyZWxhdGlvbnMKYGBge3J9CgogIHogPC0gcWdyYXBoKFIsIGxheW91dCA9ICJzcHJpbmciLCB0aXRsZSA9ICdTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gYWxsIGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCgoKIyBTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gY2lyY2xlIGxheW91dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFNpZ25pZmljYW50IGNvcnJlbGF0aW9ucwpgYGB7ciwgd2FybmluZz1GQUxTRX0KICB6IDwtIHFncmFwaChyLCBsYXlvdXQgPSAiY2lyY2xlIiwgdGl0bGUgPSAnU3BlcmFtYW4gY29ycmVsYXRpb24gbmV0d29yayAtIHNpZ25pZmljYW50IGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCiMjIEFsbCBjb3JyZWxhdGlvbnMKYGBge3J9CiAgeiA8LSBxZ3JhcGgoUiwgbGF5b3V0ID0gImNpcmNsZSIsIHRpdGxlID0gJ1NwZXJhbWFuIGNvcnJlbGF0aW9uIG5ldHdvcmsgLSBhbGwgY29ycmVsYXRpb25zJywgRG9Ob3RQbG90PVRSVUUsIGRpcmVjdGVkPUZBTFNFLCBiaWRpcmVjdGlvbmFsPVRSVUUpCiAgeiRncmFwaEF0dHJpYnV0ZXMkTm9kZXMkbGFiZWxzIDwtIG5hbWVzKHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscykKICBwbG90KHopCmBgYAoKCgojIFNwZXJhbWFuIGNvcnJlbGF0aW9uIG5ldHdvcmsgLSB3aXRoIExBU1NPIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CgogICNOZWVkZWQgb25seSBpZiBjb3IoTSkgaXMgbm8gUEQKICAjY29sbmFtZXMoTSkgPC0gc2lnJFNZTUJPTAogICNNTSA8LSBjb2xsYXBzZW1heGNvcihNLCBtZXRob2QgPSAncGVhcnNvbicpCiAgI3doaWxlKCFhdHRyKE1NLCAnUEQnKSkgewogICMgIE1NIDwtIGNvbGxhcHNlbWF4Y29yKE1NLCBtZXRob2QgPSAncGVhcnNvbicpCiAgI30KCiAgCmBgYAoKIyMgU2lnbmlmaWNhbnQgY29ycmVsYXRpb25zCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQogIHIgPC0gY29yKE0pCiAgcCA8LSBjb3JyLnAociwgMjAwMDAsIGFkanVzdCA9ICdub25lJykKCiAgcltwJHAgPiAwLjA1XSA8LSAwICMKICBFQklDZ3JhcGggPC0gRUJJQ2dsYXNzbyhyLCAyMDAwMCwgMC41KQogIHogPC0gcWdyYXBoKEVCSUNncmFwaCwgbGF5b3V0ID0gInNwcmluZyIsIHRpdGxlID0gJ1NwZXJhbWFuIGNvcnJlbGF0aW9uIG5ldHdvcmsgLSBzaWduaWZpY2FudCBjb3JyZWxhdGlvbnMnLCBEb05vdFBsb3Q9VFJVRSwgZGlyZWN0ZWQ9RkFMU0UsIGJpZGlyZWN0aW9uYWw9VFJVRSkKICB6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMgPC0gbmFtZXMoeiRncmFwaEF0dHJpYnV0ZXMkTm9kZXMkbGFiZWxzKQogIHBsb3QoeikKYGBgCgojIyBBbGwgY29ycmVsYXRpb25zCmBgYHtyfQogIHIgPC0gY29yKE0pCiAgRUJJQ2dyYXBoIDwtIEVCSUNnbGFzc28ociwgMjAwMDAsIDAuNSkKICB6IDwtIHFncmFwaChFQklDZ3JhcGgsIGxheW91dCA9ICJzcHJpbmciLCB0aXRsZSA9ICdTcGVyYW1hbiBjb3JyZWxhdGlvbiBuZXR3b3JrIC0gYWxsIGNvcnJlbGF0aW9ucycsIERvTm90UGxvdD1UUlVFLCBkaXJlY3RlZD1GQUxTRSwgYmlkaXJlY3Rpb25hbD1UUlVFKQogIHokZ3JhcGhBdHRyaWJ1dGVzJE5vZGVzJGxhYmVscyA8LSBuYW1lcyh6JGdyYXBoQXR0cmlidXRlcyROb2RlcyRsYWJlbHMpCiAgcGxvdCh6KQpgYGAKCgo=